package com.atguigu.lease.admin.controller.apartment;

import com.atguigu.lease.admin.service.LabelInfoService;
import com.atguigu.lease.model.bean.LabelInfo;
import com.atguigu.lease.model.enums.ItemType;
import com.atguigu.lease.model.result.Response;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.enums.ParameterIn;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@Tag(name = "标签管理模块")
@RestController
@RequestMapping("/admin/label")
public class LabelInfoController {
    @Autowired
    private LabelInfoService labelInfoService;
    @Operation(summary = "3、根据id删除标签")
    @DeleteMapping("deleteById")
    public Response deleteById(
            @Parameter(description = "标签id" ,required = true , in = ParameterIn.QUERY)
            @RequestParam("id") Long id){
        labelInfoService.removeById(id);
        return Response.ok(null);
    }


    @Operation(summary = "2、新增或修改标签")
    @PostMapping("saveOrUpdate")
    public Response saveOrUpdate(@RequestBody LabelInfo labelInfo) {
        labelInfoService.saveOrUpdate(labelInfo);
        return Response.ok(null);
    }

    /**
     *  通过枚举类 绑定 类型 和类型的值，接收参数时使用枚举对象接收
     *  如果使用的参数值 匹配不到枚举对象 接口就无法接受请求
     *
     *
     *  springmvc默认接收参数：
     *      1、请求体-> RequestBody 获取json转为java对象
     *      2、请求参数-> url?k=v    @ReuqestParam(k) 接收k的值使用，pojo入参
     *      3、领参数-> /path/k/k2  @pathVariable 获取路径参数
     *  但是有些场景超出了springmvc能够处理的范围：
     *      例如：
     *          前端 传入了type=1  ，后端需要 使用type的值 匹配对应的枚举对象
     *              使用type的值 和 ItemType枚举对象的 code值进行比较，如果一样则使用这个枚举对象  否则不使用
     *      springmvc 中我们按照他的要求自定义消息转换器：
     *          可以按照我们自己的逻辑 将请求参数转为 我们需要的类型传入到 handler方法中
     *  消息转换器的使用：
     *      1、创建自定义消息转换器 实现 Converter<ItemType>接口，泛型表示转换器 处理后返回的类型
     *      2、注册消息转换器给springmvc：让他生效
     * @return
     */
    @Operation(summary = "1、根据标签类型查询标签列表: type- 1:公寓，2：房间")
    @GetMapping("list") // list?type=1
    public Response<List<LabelInfo>> list(
            @RequestParam(value = "type" , required = false) //type参数不是必须的
            ItemType type){
        List<LabelInfo> list = labelInfoService.list(Wrappers
                .lambdaQuery(LabelInfo.class)
                // mp根据条件生成sql语句， 如果值是枚举类，mp支持使用EnumValue注解 标注使用枚举的哪个属性当做值使用
                .eq(type != null, LabelInfo::getType, type));

        return Response.ok(list);
    }
    // 下面的 已经可以实现 按照类型查询标签列表了，但是 传入的type值无法限制
//    @Operation(summary = "根据标签类型查询标签列表: type- 1:公寓，2：房间")
//    @GetMapping("list") // list?type=1
//    public Response<List<LabelInfo>> list(
//            @Parameter(name = "type" , description = "标签类型：1:公寓，2：房间",examples = {
//                    @ExampleObject(value = "1", description = "公寓类型"),
//                    @ExampleObject(value = "2" , description = "房间类型")
//            })
//            @RequestParam(value = "type" , required = false) //type参数不是必须的
//            Integer type){
//        List<LabelInfo> labelInfos = labelInfoService.list(Wrappers
//                        .lambdaQuery(LabelInfo.class)
////                当type不为空，条件才会生效， 生成 where type = 1条件sql
//                        .eq(type != null, LabelInfo::getType, type)
//        );
//
//        return Response.ok(labelInfos);
//    }

}
